package com.vcg.vdam;

import org.springframework.objenesis.instantiator.util.UnsafeUtils;
import sun.misc.Unsafe;

/**
 * @ClassName TestPark
 * @Description TODO
 * @Author yangxing02
 * @Date 2020/10/30 14:20
 * @Version 1.0
 */
public class TestPark {
//    public static void main(String[] args) {
//
//        Unsafe unsafe = UnsafeUtils.getUnsafe();
//
//        Thread currThread = Thread.currentThread();
////如果在调用park前调用unpark；那么park相当于无效；不会把当前线程挂起；
//        //如果在调用park前不调用unpark;park会把当前线程挂起
//        //park方法中的false和true主要影响的是后面那个数字的单位；一个是纳秒；一个是毫秒
//        //但是如果你把时间写为0;他会默认挂起；没有时间限制（自己测试得效果）
////        unsafe.unpark(currThread);
////        unsafe.unpark(currThread);
////        unsafe.unpark(currThread);
//
//        unsafe.park(false, 2);
////        unsafe.park(false, 0);
//
//        System.out.println("SUCCESS!!!");
//    }

    //在当前线程中断的时候或者调用unpark的时候;挂起的线程会被唤醒
//    public static void main(String[] args) throws Exception {
//
//        Unsafe unsafe = UnsafeUtils.getUnsafe();
//
//        Thread currThread = Thread.currentThread();
//        new Thread(()->{
//            try {
//                Thread.sleep(3000);
//                currThread.interrupt();
//                //unsafe.unpark(currThread);
//            } catch (Exception e) {}
//        }).start();
//
//        unsafe.park(false, 0);
//
//        System.out.println("SUCCESS!!!");
//    }

    //如果是相对时间也就是isAbsolute为false（注意这里后面的单位纳秒）到期的时候
//    public static void main(String[] args) throws Exception {
//
//        Unsafe unsafe = UnsafeUtils.getUnsafe();
//        //相对时间后面的参数单位是纳秒
//        unsafe.park(false, 3000000000l);
//
//        System.out.println("SUCCESS!!!");
//    }

    // 如果是绝对时间也就是isAbsolute为true(注意后面的单位是毫秒)到期的时候
    public static void main(String[] args) throws Exception {

        Unsafe unsafe = UnsafeUtils.getUnsafe();

        long time = System.currentTimeMillis()+3000;

        //绝对时间后面的参数单位是毫秒
        unsafe.park(true, time);

        System.out.println("SUCCESS!!!");
    }

    //unpark方法最好不要在调用park前对当前线程调用unpark
}
